﻿#ifndef PHASEWIDGET_H
#define PHASEWIDGET_H

#include <QWidget>
#include <QPainter>
#include <QPen>
#include <QBrush>
#include <QColor>
#include <QTimer>
#include <QMouseEvent>
#include <QScopedPointer>
#include <cmath>

#define BACK_COLOR "#050d2c"
#define FOREGROUND_COLOR "#FFFFFF"

/// <summary>
/// 管理通道的数据解构
/// </summary>
struct ChannelInfo
{
    int channelId;              // 通道ID
    int channelname;            // 通道名称
    double phaseSize;              // 相位角
    double value;                  // 值
    QColor color;               // 颜色

    ChannelInfo() :phaseSize(0.000), value(0.000)
    {

    }
};


/// <summary>
/// 管理数组信息，在属性中有多个不同的组
/// </summary>
struct GroupInfo
{
    int id;                      // id 为随机的，无所谓
    QString groupName;
    QList<QScopedPointer<ChannelInfo>> listChannel;
};

class PhaseWidget : public QWidget
{
    Q_OBJECT
    Q_PROPERTY(double phase READ phase WRITE setPhase NOTIFY phaseChanged)
    Q_PROPERTY(bool editable READ editable WRITE setEditable NOTIFY editableChanged)
    Q_PROPERTY(bool animated READ animated WRITE setAnimated NOTIFY animatedChanged)
    Q_PROPERTY(int animationDuration READ animationDuration WRITE setAnimationDuration NOTIFY animationDurationChanged)
    Q_PROPERTY(double referenceValue READ referenceValue WRITE setReferenceValue NOTIFY referenceValueChanged)

public:
    explicit PhaseWidget(QWidget *parent = nullptr);
    ~PhaseWidget();

    // 获取值
    double referenceValue() const;
    // 设置值
    void setReferenceValue(double value);

    // 获取相位值(0-360度)
    double phase() const;

    // 设置相位值(0-360度)
    void setPhase(double phase);

    // 设置相位值(带动画效果)
    void setPhaseAnimated(double targetPhase);

    // 是否可编辑(通过鼠标拖动改变相位)
    bool editable() const;
    void setEditable(bool editable);

    // 是否启用动画效果
    bool animated() const;
    void setAnimated(bool animated);

    // 动画持续时间(毫秒)
    int animationDuration() const;
    void setAnimationDuration(int duration);

    // 设置相位范围限制
    void setPhaseRange(double minPhase, double maxPhase);

    // 获取相位范围
    QPair<double, double> phaseRange() const;

    // 设置网格线数量
    void setGridCount(int radialCount, int circularCount);

    // 设置显示角度标签
    void setShowAngleLabels(bool show);

    // 设置显示相位值文本
    void setShowPhaseValue(bool show);

    // 设置超量程
    void setShowOverrange(bool show);

    // 设置网格显示
    void setShowGrid(bool show);

protected:
    void paintEvent(QPaintEvent *event) override;
    void resizeEvent(QResizeEvent *event) override;
    void mousePressEvent(QMouseEvent *event) override;
    void mouseMoveEvent(QMouseEvent *event) override;
    void mouseReleaseEvent(QMouseEvent *event) override;
    void wheelEvent(QWheelEvent *event) override;

private:
    // 绘制极坐标背景
    void drawPolarBackground(QPainter &painter);

    // 绘制相位指针
    void drawPhaseIndicator(QPainter &painter);

    // 绘制角度标签
    void drawAngleLabels(QPainter &painter);

    // 绘制相位值文本
    void drawPhaseValue(QPainter &painter);

    // 将角度转换为坐标系中的点
    QPointF angleToPoint(double angle, double radiusFactor = 1.0) const;

    // 将坐标点转换为角度
    double pointToAngle(const QPointF &point) const;

    // 规范化相位值到0-360度范围
    double normalizePhase(double phase) const;

    // 更新动画状态
    void updateAnimation();

    // 绘制相位名称和活动事件
    void drawPaseInfo(QPainter& painter);


signals:
    void phaseChanged(double phase);
    void editableChanged(bool editable);
    void animatedChanged(bool animated);
    void animationDurationChanged(int duration);
    void referenceValueChanged(double value);
    void userInteractionStarted();
    void userInteractionFinished();

private slots:
    void onAnimationTimerTimeout();

private:
    double m_phase;               // 当前相位值(0-360度)
    double m_targetPhase;         // 动画目标相位值
    bool m_editable;              // 是否可编辑
    bool m_animated;              // 是否启用动画
    int m_animationDuration;      // 动画持续时间(毫秒)
    QTimer *m_animationTimer;     // 动画计时器
    int m_animationProgress;      // 动画进度(0-100)
    bool m_isDragging;            // 是否正在拖动
    double m_minPhase;            // 最小相位值
    double m_maxPhase;            // 最大相位值
    int m_radialGridCount;        // 径向网格线数量
    int m_circularGridCount;      // 圆形网格线数量
    bool m_showAngleLabels;       // 是否显示角度标签
    bool m_showPhaseValue;        // 是否显示相位值文本
    QPoint m_lastMousePos;        // 上次鼠标位置

    QColor m_backColor;   // 背景颜色
    QColor m_foregroundColor; // 前景颜色
    QFont m_font;            // 字体

    double m_referenceValue;               // 当前的参考值大小
    bool m_showOverrange;                   // 显示超量程
    bool m_showGrid;                        // 显示网格
    
    // 定义两个矩形，一个为文本矩形，一个为相位矩形
    QRect m_rectPhase;
    QRect m_rectText;

    //QList<QScopedPointer<GroupInfo>> m_listGroupInfo;
    //QString m_strPlotName;        // 名称

    ///计算使用
private:
    // 计算矩形区域
    void calculateRectRage();
    // 计算文本的矩形是否在矩形的左上0.3倍
    bool isInsideTopElipse(const QRect& rect, const QPoint& point);


};

#endif // PHASEWIDGET_H
